﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bank
{
    class Program
    {
		/// <summary>
		/// Вывести сообщение в консоль
		/// </summary>
		/// <param name="msg"></param>
		static void Message(string msg)
		{
			Console.Write(msg);
		}

		/// <summary>
		/// Прочитать строку с консоли
		/// </summary>
		/// <returns></returns>
		static string ReadString()
		{
			return Console.ReadLine();
		}

		/// <summary>
		/// Запросить номер счёта
		/// </summary>
		/// <returns></returns>
		static string GetAccountID()
		{
			Message("Введите номер счёта в формате XXX-XXXXXX-YY-MM :");
			return ReadString();
		}

		/// <summary>
		/// Запросить сумму
		/// </summary>
		/// <returns></returns>
		static double GetAmount()
		{
			Message("Введите сумму денег :");
			return double.Parse(Console.ReadLine());
		}

		/// <summary>
		/// Выбрать пункт меню
		/// </summary>
		/// <returns></returns>
		static string ReadChoice()
		{
			string[] choices = { "K", "C", "+", "-", "T", "I", "F", "Q" };
			string choice = Console.ReadLine();
			choice = choice.Trim();
			choice = choice.ToUpper();
			foreach (string ch in choices)
			{
				if (choice == ch)
				{
					return choice;
				}
			}
			Message("Неверный выбор. Попробуйте снова: ");
			return ReadChoice();		
		}

		/// <summary>
		/// Вывести на консоль меню
		/// </summary>
		static void ShowMenu()
		{
			string txtMenu = " ============ Система \"Виртуальный Банк\" ============ \n";
			txtMenu += " Секция обслуживания счетов: \n";
			txtMenu += "\t Нажмите 'K' чтобы создать нового клиента: \n";
			txtMenu += "\t Нажмите 'C' чтобы открыть новый счёт: \n";
			txtMenu += " Секция операций над счетами: \n";
			txtMenu += "\t Нажмите '+' чтобы добавить деньги на счёт: \n";
			txtMenu += "\t Нажмите '-' чтобы снять деньги со счёта: \n";
			txtMenu += "\t Нажмите 'T' чтобы перевести деньги на другой счёт: \n";
			txtMenu += "\t Нажмите 'I' чтобы вывести информацию о текущем счёте \n";
			txtMenu += "\t Нажмите 'F' чтобы перейти к счёту с номером XX-XXXXXX-YY-MM \n";
			txtMenu += "\t Нажмите 'Q' для выхода из системы \n";
			txtMenu += "\t ============================================= \n";
			txtMenu += "\t Ваш выбор: ";
			Message(txtMenu);		
		}

        static void Main(string[] args)
        {
			// создадим банк
			Bank CurrentBank = new Bank("ЗАО \"ПриорБанк\"");
			Client CurrentClient = null;
			Account CurrentAccount = null;
			// Выведем на консоль меню управления
			ShowMenu();
			// находимся в меню пока не нажали 'q' или 'Q'
			while (true)
			{
				string choice = ReadChoice();
				if (choice == "Q")
					break;
				else
				if (choice == "K") // создать нового клиента
				{
					CurrentClient = CurrentBank.CreateClient();					
				}
				else
				if (choice == "C") // открыть новый счёт
				{
					if (CurrentClient == null)
					{
						Message("Сначала создайте клиента, которому нужно открыть счёт\n");
						Message("\t Ваш выбор: ");
						continue;
					}
					CurrentAccount = CurrentBank.CreateAccount(CurrentClient);
				}
				else
				if (choice == "I") // информация о счёте
				{
					// Если счёт присутствует, выведем информацию о нём
					if (CurrentAccount != null)
					{
						CurrentAccount.ToString();
					}
					else
						Message("Отсутствует счёт!\n");
				}
				else
				if (choice == "+") // добавить деньги на счёт
				{
					if (CurrentAccount != null)
					{
						// Запросим сумму денег
						double newSumm = GetAmount();
						// добавим деньги на счёт						
						CurrentAccount.MoneyInc(newSumm);
					}
					else
						Message("Отсутствует счёт!\n");
				}
				else
				if (choice == "-") // снять деньги со счёта
				{
					if (CurrentAccount != null)
					{
						// Запросим сумму денег
						double newSumm = GetAmount();
						// попытаемся снять деньги со счёта
						CurrentAccount.MoneyDec(newSumm);
					}
					else
						Message("Отсутствует счёт!\n");
				}
				else
				if (choice == "T") // перевести деньги со счёта на счёт
				{
					CurrentBank.Transfer();
				}
				else
				// перейти к Account-у с номером XXX-XXXXXX-YY-MM 
				// (XXX-код банка XXXXXX-номер счёта, YY-год, MM-месяц)
				if (choice == "F") 
				{
					// запросить номер счёта в консоли
					string acc = GetAccountID();
					// найти счёт в банке и перейти к нему, если такой найден
					Account finded = CurrentBank.FindAcc(acc);
					if (finded != null)
					{
						Message("Счёт найден. Текущий счёт: " + finded.ID);
						CurrentAccount = finded;
					}
					else
						Message("Счёт не найден\n");
				}

				Message("\t Ваш выбор: ");
			}
			Message("\n");
        }
    }
}
